Celem tej strony jest przedstawienie przykładów na poziomie początkującego użytkownika Menedżera GUI PySide (strony uzupełniające: Średniozaawansowane przykłady PySide oraz Zaawansowane przykłady PySide).
Osoby nowe w programowaniu GUI mogą potknąć się o słowo "widget". Jego definicja poza obliczeniami zwykle ma postać:
"mały gadżet lub urządzenie mechaniczne, szczególnie takie, którego nazwa jest nieznana lub nieokreślona"
W przypadku pracy z GUI, takiej jak PySide, termin "widget" najczęściej odnosi się do widocznych elementów interfejsu graficznego – okien, dialogów oraz elementów wejścia/wyjścia. Wszystkie widoczne elementy PySide nazywane są widgetami i, dla zainteresowanych, wszystkie one pochodzą od wspólnej klasy bazowej – QWidget. Oprócz elementów widocznych, PySide oferuje także widgety do obsługi sieci, XML, multimediów oraz integracji z bazami danych.
Widget, który nie jest osadzony w innym widgetcie, nazywany jest oknem i zazwyczaj posiada ramkę oraz pasek tytułu. Najczęściej spotykanymi typami okien są "okno główne" (klasa QMainWindow) oraz różne podklasy okna dialogowego (klasa QDialog). Istotną różnicą między nimi jest to, że QDialog jest modalny (tzn. użytkownik nie może wykonywać żadnych działań poza oknem dialogowym, dopóki jest ono otwarte), natomiast QMainWindow jest niemodalne, co pozwala użytkownikowi na równoczesną interakcję z innymi oknami.
Ten poradnik jest skrótową listą dla szybkiego uzyskania działającego programu PySide we FreeCAD, nie ma na celu uczenia Pythona lub PySide. Niektóre strony do tego:
PySide nie jest domyślnie ładowany z Pythonem, musi być wcześniej zażądany przed jego użyciem. Następujące polecenie:
from PySide import QtCore
from PySide import QtGui
powoduje załadowanie dwóch części PySide – QtGui zawiera klasy do obsługi graficznego interfejsu użytkownika, natomiast QtCore zawiera klasy, które nie są bezpośrednio związane z obsługą GUI (np. timery i geometria). Chociaż możliwe jest zaimportowanie tylko jednej z tych części, zazwyczaj potrzebne są obie i obie są importowane.
Określenia importu nie są powtarzane we fragmentach kodu poniżej; zakłada się, że są wykonywane na początku w każdym przypadku.
Najprostszą interakcją z PySide jest zaprezentowanie wiadomości dla użytkownika, którą może on tylko zaakceptować:
reply = QtGui.QMessageBox.information(None,"","Houston, we have a problem")
Kolejną najprostszą interakcją jest pytanie o odpowiedź tak / nie:
reply = QtGui.QMessageBox.question(None, "", "This is your chance to answer, what do you think?",
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes:
# this is where the code relevant to a 'Yes' answer goes
pass
if reply == QtGui.QMessageBox.No:
# this is where the code relevant to a 'No' answer goes
pass
Następny fragment kodu prosi użytkownika o podanie fragmentu tekstu - może to być dowolny klawisz na klawiaturze:
reply = QtGui.QInputDialog.getText(None, "Ouija Central","Enter your thoughts for the day:")
if reply[1]:
# user clicked OK
replyText = reply[0]
else:
# user clicked Cancel
replyText = reply[0] # which will be "" if they clicked Cancel
Należy pamiętać, że nawet jeśli użytkownik wprowadzi tylko cyfry, na przykład "1234", są one ciągami znaków i muszą zostać przekonwertowane na reprezentację liczbową za pomocą jednej z poniższych metod:
anInteger = int(userInput) # to convert to an integer from a string representation
aFloat = float(userInput) # to convert to a float from a string representation
Ostatni przykład na poziomie początkującym pokazuje, jak zbudować okno dialogowe z dowolną liczbą przycisków. Ten przykład jest zbyt złożony programistycznie, by można go było uruchomić za pomocą pojedynczej instrukcji Pythona, więc pod pewnymi względami powinien znajdować się na następnej stronie: Średniozaawansowane przykłady PySide. Z drugiej strony jednak, często jest to wszystko, czego potrzeba bez wchodzenia w skomplikowane definicje GUI, dlatego kod umieszczono na końcu tej strony, a nie na początku kolejnej.
from PySide import QtGui, QtCore
class MyButtons(QtGui.QDialog):
""""""
def __init__(self):
super(MyButtons, self).__init__()
self.initUI()
def initUI(self):
option1Button = QtGui.QPushButton("Option 1")
option1Button.clicked.connect(self.onOption1)
option2Button = QtGui.QPushButton("Option 2")
option2Button.clicked.connect(self.onOption2)
option3Button = QtGui.QPushButton("Option 3")
option3Button.clicked.connect(self.onOption3)
option4Button = QtGui.QPushButton("Option 4")
option4Button.clicked.connect(self.onOption4)
option5Button = QtGui.QPushButton("Option 5")
option5Button.clicked.connect(self.onOption5)
#
buttonBox = QtGui.QDialogButtonBox()
buttonBox = QtGui.QDialogButtonBox(QtCore.Qt.Horizontal)
buttonBox.addButton(option1Button, QtGui.QDialogButtonBox.ActionRole)
buttonBox.addButton(option2Button, QtGui.QDialogButtonBox.ActionRole)
buttonBox.addButton(option3Button, QtGui.QDialogButtonBox.ActionRole)
buttonBox.addButton(option4Button, QtGui.QDialogButtonBox.ActionRole)
buttonBox.addButton(option5Button, QtGui.QDialogButtonBox.ActionRole)
#
mainLayout = QtGui.QVBoxLayout()
mainLayout.addWidget(buttonBox)
self.setLayout(mainLayout)
# define window xLoc,yLoc,xDim,yDim
self.setGeometry( 250, 250, 0, 50)
self.setWindowTitle("Pick a Button")
self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
def onOption1(self):
self.retStatus = 1
self.close()
def onOption2(self):
self.retStatus = 2
self.close()
def onOption3(self):
self.retStatus = 3
self.close()
def onOption4(self):
self.retStatus = 4
self.close()
def onOption5(self):
self.retStatus = 5
self.close()
def routine1():
print ('routine 1')
form = MyButtons()
form.exec_()
if form.retStatus==1:
routine1()
elif form.retStatus==2:
routine2()
elif form.retStatus==3:
routine3()
elif form.retStatus==4:
routine4()
elif form.retStatus==5:
routine5()
Każdy testowany fragment kodu powinien znajdować się w funkcji o nazwie 'routine1()', 'routine2()' itd. Można użyć tylu przycisków, ile zmieści się na ekranie. Należy podążać za schematem przedstawionym w przykładzie kodu i dodawać dodatkowe przyciski w razie potrzeby - okno dialogowe automatycznie dostosuje swoją szerokość, aż do maksymalnej szerokości ekranu.
Jest linia kodu:
buttonBox = QtGui.QDialogButtonBox(QtCore.Qt.Horizontal)
która powoduje, że przyciski są w linii poziomej. Aby umieścić je na linii pionowej, zmień linię kodu na:
buttonBox = QtGui.QDialogButtonBox(QtCore.Qt.Vertical)